perm filename VISBIG.SAI[VIS,HPM]4 blob sn#199657 filedate 1976-01-29 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	REAL PROCEDURE SEARCH(REFERENCE INTEGER PIC1MAP,PIC2MAP
C00009 00003	PROCEDURE FINDIN(REFERENCE INTEGER PICMAP INTEGER WINDOWSIZE 
C00014 ENDMK
C⊗;
REAL PROCEDURE SEARCH(REFERENCE INTEGER PIC1MAP,PIC2MAP;
		      INTEGER WINDOWSIZE;
		      REFERENCE REAL POSY,POSX;
		      REAL DY1(0),DX1(0),DY2(1),DX2(1) );

COMMENT applies the binary search correlation method to find a window
        centered about POSX,POSY in PIC1 (defined to be 0 to 1 in X and Y),
	and of size WINDOWSIZE pixels square in the whole of PIC2. PIC1MAP
	and PIC2MAP are an array of starting addresses of successively
	reduced versions of the pictures. The best match in PIC2 is returned
	in POSX and POSY, the value of the match (0 to 1) is the value of SEARCH.
        The search can be constrained to the rectangle bounded by DY1,DX1,
	DY2,DX2 (all 0 to 1) if desired;

   BEGIN
   INTEGER IL,JL,IH,JH,WID,HIG,NORD,I,J,K,L,M,N;   REAL QUAL;
   REAL PXF,PYF;
   INTEGER ILT,JLT,IHT,JHT,
           ILS,JLS,IHS,JHS,
           ISC,JSC,ITC,JTC,
           ISS,JSS,ITS,JTS;
   REAL QUALT,PXFT,PYFT;

   BOOLEAN PROCEDURE TRYRED(INTEGER MS,MT);
      BEGIN
      BOOLEAN ANS;
      ANS←FALSE;
      IF QUALT<.8 THEN
         BEGIN
         REAL PXFTT,PYFTT,QUALTT,QUATTT;
         INTEGER WISH; BOOLEAN LOSE;

         OUTSTR(CVS(MS)&":"&CVS(MT)&" ");

         ISC←(ISS←MEMORY[MEMORY[LOCATION(PIC1MAP)+MS]+PCLN])*POSY;
         JSC←(JSS←MEMORY[MEMORY[LOCATION(PIC1MAP)+MS]+LNBY])*POSX;
         ITC←(ITS←MEMORY[MEMORY[LOCATION(PIC2MAP)+MT]+PCLN])*PYF;
         JTC←(JTS←MEMORY[MEMORY[LOCATION(PIC2MAP)+MT]+LNBY])*PXF;

         WISH←WINDOWSIZE; QUALTT←0;
         DO
            BEGIN
            LOSE←TRUE;
            WISH←WISH%2;

            JLS←JSC-WISH;
            ILS←ISC-WISH;
            JHS←JSC+WISH;
            IHS←ISC+WISH;

            JLT←(JTC-WINDOWSIZE) MAX (JTS*DX1-WISH-1);
            ILT←(ITC-WINDOWSIZE) MAX (ITS*DY1-WISH-1);
            JHT←(JTC+WINDOWSIZE) MIN (JTS*DX2+WISH+1);
            IHT←(ITC+WINDOWSIZE) MIN (ITS*DY2+WISH+1);

            OUTSTR("["&CVS(JLS)&":"&CVS(JHS)&","&CVS(ILS)&":"&CVS(IHS)&"]ε");
            OUTSTR("["&CVS(JLT)&":"&CVS(JHT)&","&CVS(ILT)&":"&CVS(IHT)&"]→");

            QUATTT←NORCOR(MEMORY[MEMORY[LOCATION(PIC1MAP)+MS]],ILS,JLS,IHS,JHS,
                          MEMORY[MEMORY[LOCATION(PIC2MAP)+MT]],ILT,JLT,IHT,JHT);

            OUTSTR("["&CVS(JLT)&":"&CVS(JHT)&","&CVS(ILT)&":"&CVS(IHT)&"]"
                   &CVF(QUATTT)&" ");
            IF QUATTT>QUALTT THEN
               BEGIN
               PXFTT←0.5*(JLT+JHT)/JTS;
               PYFTT←0.5*(ILT+IHT)/ITS;
               QUALTT←QUATTT;
               LOSE←FALSE;
               END;
            END
         UNTIL QUALTT≥.65 ∨ WISH≤1 ∨ LOSE;
         SETFORMAT(0,3);
         OUTSTR(CVF(QUALT)&" TO"&CVF(QUALTT));
         IF QUALTT>QUALT THEN
            BEGIN
            OUTSTR("→("&CVF(PXFTT)&","&
                   CVF(PYFTT)&") ");
            QUALT←QUALTT;
            PXFT←PXFTT;
            PYFT←PYFTT;
            ANS←TRUE;
            END;
         OUTSTR('15&'12);
         RETURN(ANS);
         END;
      END;

   IF DX1>DX2 THEN DX1↔DX2;
   IF DY1>DY2 THEN DY1↔DY2;
   IF DX1≥1∨DX2≤0∨DY1≥1∨DY2≤0 THEN RETURN(0);
   DX1←DX1 MAX 0; DX2←DX2 MIN 1; DY1←DY1 MAX 0; DY2←DY2 MIN 1;

   WID←MEMORY[PIC1MAP+LNBY]*ABS(DX2-DX1);
   HIG←MEMORY[PIC1MAP+PCLN]*ABS(DY2-DY1);
   NORD←0;
   WHILE WINDOWSIZE≤(WID MIN HIG)/2↑(NORD+1) DO NORD←NORD+1;

   OUTSTR("FINAL PICTURE IS "&
      CVS(MEMORY[MEMORY[LOCATION(PIC1MAP)+NORD]+LNBY])&" BY "&
      CVS(MEMORY[MEMORY[LOCATION(PIC1MAP)+NORD]+PCLN])&'15&'12);

   PXF←(DX1+DX2)/2; PYF←(DY1+DY2)/2;
   QUAL←1;

   FOR M←NORD STEP -1 UNTIL 0 DO
      BEGIN
      QUALT←-1.0;

                   IF TRYRED(   M,   M)    THEN
      IF M≤3 THEN  IF TRYRED(   M,-M-1)    THEN
      IF M≤2 THEN  IF TRYRED(-M-1, M+1)    THEN
      IF M≤1 THEN     TRYRED(   M, M+1)       ;

      OUTSTR('15&'12);

      PXF←PXFT;
      PYF←PYFT;

      QUAL←QUAL MIN QUALT;
      END;

   POSX←PXF; POSY←PYF;
   RETURN(QUAL);
   END;
PROCEDURE FINDIN(REFERENCE INTEGER PICMAP; INTEGER WINDOWSIZE; 
                 REFERENCE INTEGER NFS; REFERENCE REAL FY,FX);
   BEGIN
   INTEGER IORD,HIG,WID,BIT,IW,HW;

   IORD←0; WHILE (WINDOWSIZE ASH -(IORD+1))≥2 DO IORD←IORD+1;
   IW←WINDOWSIZE ASH -IORD;
   HW←(IW+1)%2;
   IW←2*HW;
   
   HIG←MEMORY[MEMORY[LOCATION(PICMAP)+IORD]+PCLN];
   WID←MEMORY[MEMORY[LOCATION(PICMAP)+IORD]+LNBY];
   BIT←MEMORY[MEMORY[LOCATION(PICMAP)+IORD]+BYBI];

      BEGIN
      INTEGER IAV,I,J,K,AH,AW,FHAV,AWR,AHR;
      SAFE INTEGER ARRAY
      INTER[ 0 : AH ← (HIG-HW-1)%IW + (HIG-1)%IW - 1,
             0 : AW ← (WID-HW-1)%IW + (WID-1)%IW - 1 ];
      REAL ARRAY FXV,FYV,FIV[1:NFS];

         BEGIN
         INTEGER AH,AW;
         SAFE INTEGER ARRAY I00[-2:AH←(HIG-1)%IW-1, 0:AW←(WID-1)%IW-1];
         IAV←INTOP(MEMORY[MEMORY[LOCATION(PICMAP)+IORD]],IW,I00[0,0],0,0);
         FOR I←0 STEP 1 UNTIL AH DO
         FOR J←0 STEP 1 UNTIL AW DO
            INTER[I*2,J*2]←I00[I,J];
         END;

         BEGIN
         INTEGER AH,AW;
         SAFE INTEGER ARRAY I10[-2:AH←(HIG-HW-1)%IW-1, 0:AW←(WID-1)%IW-1];
         IAV←IAV+INTOP(MEMORY[MEMORY[LOCATION(PICMAP)+IORD]],IW,I10[0,0],HW,0);
         FOR I←0 STEP 1 UNTIL AH DO
         FOR J←0 STEP 1 UNTIL AW DO
            INTER[I*2+1,J*2]←I10[I,J];
         END;

         BEGIN
         INTEGER AH,AW;
         SAFE INTEGER ARRAY I01[-2:AH←(HIG-1)%IW-1, 0:AW←(WID-HW-1)%IW-1];
         IAV←IAV+INTOP(MEMORY[MEMORY[LOCATION(PICMAP)+IORD]],IW,I01[0,0],0,HW);
         FOR I←0 STEP 1 UNTIL AH DO
         FOR J←0 STEP 1 UNTIL AW DO
            INTER[I*2,J*2+1]←I01[I,J];
         END;

         BEGIN
         INTEGER AH,AW;
         SAFE INTEGER ARRAY I11[-2:AH←(HIG-HW-1)%IW-1, 0:AW←(WID-HW-1)%IW-1];
         IAV←IAV+INTOP(MEMORY[MEMORY[LOCATION(PICMAP)+IORD]],IW,I11[0,0],HW,HW);
         FOR I←0 STEP 1 UNTIL AH DO
         FOR J←0 STEP 1 UNTIL AW DO
            INTER[I*2+1,J*2+1]←I11[I,J];
         END;

      IAV←IAV%32;

      INTLOM(AH+1,AW+1,INTER[0,0]);  comment  flag local maxima;

      FHAV←0;

      FOR I←1 STEP 1 UNTIL AH-2 DO
      FOR J←1 STEP 1 UNTIL AW-1 DO
      IF (INTER[I,J] LAND 1)=1 ∧ INTER[I,J]>IAV THEN
         BEGIN
         REAL FXT,FYT,FIT;
         INTEGER L,H,M;

         FYT←((I+1)*HW+.5)/HIG;
         FXT←((J+1)*HW+.5)/WID;
         FIT←INTER[I,J];

         L←1; H←FHAV;
         WHILE L≤H DO IF FIT>FIV[M←(L+H)%2] THEN H←M-1 ELSE L←M+1;
         FHAV←(FHAV+1) MIN NFS;
         IF L≤FHAV THEN
            BEGIN
            FOR M←FHAV-1 STEP -1 UNTIL L DO
               BEGIN
               FXV[M+1]←FXV[M]; FYV[M+1]←FYV[M]; FIV[M+1]←FIV[M];
               END;
            FXV[L]←FXT; FYV[L]←FYT; FIV[L]←FIT;
            END;
         END;

      FOR I←1 STEP 1 UNTIL FHAV DO
         BEGIN
         MEMORY[LOCATION(FX)-1+I,REAL]←FXV[I];
         MEMORY[LOCATION(FY)-1+I,REAL]←FYV[I];
         END;
      NFS←FHAV;
      END;

   END;